# 1. cmake 版本信息
cmake_minimum_required(VERSION 3.1.3)
set(CMAKE_CXX_STANDARD 17)
# set(CMAKE_BUILD_TYPE Debug)
# 2. 声明项目名称
project(gateway-test)
set(target "sora-server")
set(target_test "gateway-client")
# 3. 检测并生成proto框架代码
#   1. 添加所需的proto映射代码文件名称
set(proto_path  ${CMAKE_CURRENT_SOURCE_DIR}/../proto)
set(odb_path  ${CMAKE_CURRENT_SOURCE_DIR}/../odb)
set(proto_files )
set(odb_files blog.hxx music.hxx vlog.hxx)
#   2. 检测框架代码文件是否已经生成
set(proto_h  "")
set(proto_cc  "")
set(proto_srcs  "")
set(odb_hxx  "")
set(odb_cxx  "")
set(odb_srcs  "")
#   3. 如果没有生成，则预定义生成指令 -- 用于在构建项目之间先生成框架代码
foreach(odb_file ${odb_files})
    string(REPLACE  ".hxx"  "-odb.hxx"  odb_hxx ${odb_file})
    string(REPLACE  ".hxx"  "-odb.cxx"  odb_cxx ${odb_file})
    if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
        add_custom_command(
            PRE_BUILD 
            COMMAND odb
            ARGS -d mysql --std c++17 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file}
            DEPENDS ${odb_path}/${odb_file}
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
            COMMENT "生成odb框架代码文件"${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
        )
    endif()
    list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
endforeach()

foreach(proto_file ${proto_files})
    string(REPLACE  ".proto"  ".pb.h"  proto_h ${proto_file})
    string(REPLACE  ".proto"  ".pb.cc"  proto_cc ${proto_file})
    if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc})
        add_custom_command(
            PRE_BUILD 
            COMMAND protoc
            ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} -I ${proto_path} --experimental_allow_proto3_optional ${proto_path}/${proto_file}
            DEPENDS ${proto_path}/${proto_file}
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc}
            COMMENT "生成proto框架代码文件"${CMAKE_CURRENT_BINARY_DIR}/${proto_cc}
        )
    endif()
    list(APPEND proto_srcs ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc})
endforeach()
# 4. 获取源码目录下的所有源码文件
set(src_files  "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)
# set(test_src_files  "")
# aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/test test_src_files)
# 5. 声明目标及依赖
add_executable(${target} ${src_files} ${proto_srcs} ${odb_srcs})
# add_executable(${target_test} ${test_src_files} ${proto_srcs} ${odb_srcs})
# 6. 设置头文件默认搜索路径
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../third)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../odb)
# 7. 设置需要连接的库
target_link_libraries(${target} -lgtest -lcrypto -lfmt -lspdlog -lgflags 
 -lcpprest -ljsoncpp -lcurl -lleveldb -lssl  
-lcpr  -lodb-mysql -lmysqlclient -lodb -lodb-boost -lev -lboost_system -lpthread)
INSTALL(TARGETS ${target}  RUNTIME DESTINATION bin)